package com.emerquim.bean.support;

import java.util.HashMap;
import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.apache.log4j.Logger;

import com.emerquim.bean.backing.Usuario;
import com.emerquim.bean.model.Agente;
import com.emerquim.bean.model.Entidad;
import com.emerquim.bean.model.ManejadorCasosMedico;
import com.emerquim.bean.model.ManejadorEventos;
import com.emerquim.bean.model.Paciente;
import com.emerquim.security.AppUser;

/**
 * Clase para manejar el control del despliegue
 * @author Felipe Criales
 */
public class ControlDespliegue {

	// --------------------------------------------------
	// Constantes para el tab de visualizacion
	// --------------------------------------------------
	/**
	 * Constante para el tab del evento
	 */
	public final static int INDEX_TAB_EVENTO = 0;
	
	/**
	 * Constante para el tab del paciente
	 */
	public final static int INDEX_TAB_PACIENTE = 1;
	
	/**
	 * Constante para el tab del agente
	 */
	public final static int INDEX_TAB_AGENTE = 2;
	
	/**
	 * Constante para el tab del caso
	 */
	public final static int INDEX_TAB_CASO = 3;
	
	/**
	 * Constante para el tab del entidades
	 */
	public final static int INDEX_TAB_ENTIDADES = 4;
	
	public final static int INDEX_TAB_USUARIOS = 5;
		
	// --------------------------------------------------
	// Constantes para los elementos que se estan viendo 
	// --------------------------------------------------
	/**
	 * Constante para el tab de Eventos
	 */
	public final static String TAB_EVENTO = "Tab_Evento";

	/**
	 * Constante para el tab de Agentes
	 */
	public final static String TAB_AGENTES = "Tab_Agentes";

	/**
	 * Constante para el tab de Pacientes
	 */
	public final static String TAB_PACIENTES = "Tab_Pacientes";

	/**
	 * Constante para el tab de Organizaciones de ayuda
	 */
	public final static String TAB_ORGANIZACIONES = "Tab_Organizaciones";
	
	/**
	 * Constante para el tab de Casos
	 */
	public final static String TAB_CASO = "Tab_Caso";
	
	/**
	 * Constante para el tab de Usuarios
	 */
	public final static String TAB_USUARIOS = "tab_usuarios";

	/**
	 * Constante para la sub vista de consultar un evento
	 */
	public final static String SUB_VISTA_CONSULTAR_EVENTO = "Sub_Vista_Consultar_Evento";

	/**
	 * Constante para la sub vista de nuevo evento
	 */
	public final static String SUB_VISTA_NUEVO_EVENTO = "Sub_Vista_Nuevo_Evento";	

	/**
	 * Constante para la sub vista de consultar un paciente
	 */
	public final static String SUB_VISTA_CONSULTAR_PACIENTE = "Sub_Vista_Consultar_Paciente";

	/**
	 * Constante para la sub vista de nuevo paciente
	 */
	public final static String SUB_VISTA_NUEVO_PACIENTE = "Sub_Vista_Nuevo_Paciente";	
	
	/**
	 * Constante para la subvista de nueva organizacion
	 */
	public final static String SUB_VISTA_NUEVA_ORGANIZACION = "Sub_Vista_Nueva_Organizacion";
	
	/**
	 * Constante para la subvista de nueva organizacion
	 */
	public final static String SUB_VISTA_CONSULTAR_ORGANIZACION = "Sub_Vista_Consultar_Organizacion";
	
	/**
	 * Constante para la sub vista de consultar un agente
	 */
	public final static String SUB_VISTA_CONSULTAR_AGENTE = "Sub_Vista_Consultar_Agente";

	/**
	 * Constante para la sub vista para el nuevo agente
	 */
	public final static String SUB_VISTA_NUEVO_AGENTE = "Sub_Vista_Nuevo_Agente";
	
	/**
	 * Constante para la sub vista para el nuevo agente
	 */
	public final static String SUB_VISTA_CONSULTAR_CASOS = "Sub_Vista_Consultar_Casos";	
	
	/**
	 * Constantes para las sub vistas para Usuarios
	 */
	public final static String SUB_VISTA_CONSULTAR_USUARIOS = "Sub_Vista_Consultar_Usuarios";
	public final static String SUB_VISTA_CREAR_USUARIO = "Sub_Vista_Crear_Usuario";

	// --------------------------------------------------
	// Atributos
	// --------------------------------------------------
	/**
	 * Funcionalidad de log
	 */
	private static final Logger log = Logger.getLogger(ControlDespliegue.class);
	
	/**
	 * Atributo para el mapa de los elementos que se estan viendo en la interfaz
	 */
	private Map<String, Boolean> mapaControlDespliegue;

	/**
	 * Atributo para el indice de la pestania que se esta viendo
	 */
	private int indexTabPrincipal;

	/**
	 * Constructor de la clase
	 */
	public ControlDespliegue(){
		mapaControlDespliegue = new HashMap<String, Boolean>();
		
		mapaControlDespliegue.put(this.TAB_EVENTO, new Boolean(true));
		mapaControlDespliegue.put(this.TAB_AGENTES, new Boolean(true));
		mapaControlDespliegue.put(this.TAB_PACIENTES, new Boolean(true));
		mapaControlDespliegue.put(this.TAB_ORGANIZACIONES, new Boolean(true));
		mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_EVENTO, null);
	}

	/**
	 * Metodo para seleccionar el tab
	 */
	private void seleccionartab(){
		FacesContext context = FacesContext.getCurrentInstance();
		AppUser appUser = (AppUser) context.getApplication().evaluateExpressionGet(context, "#{appUser}", AppUser.class);
		if(appUser != null){
			java.util.Iterator<String> it = appUser.getRoles().iterator();
			while(it.hasNext()){
				String rol = (String)it.next();
				if(rol.equals("ROLE_ADMIN")){
					indexTabPrincipal = this.INDEX_TAB_EVENTO;
					
				}
				else if(rol.equals("ROLE_MEDICO")){
					indexTabPrincipal = this.INDEX_TAB_CASO;
					mapaControlDespliegue.put(this.TAB_CASO, new Boolean(true));
					mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_CASOS, new Boolean(true));
					break;    	
				}	
				else if(rol.equals("ROLE_ASESOR")){
					indexTabPrincipal = this.INDEX_TAB_EVENTO;
					mapaControlDespliegue.put(this.TAB_CASO, new Boolean(true));
					mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_CASOS, new Boolean(true));
					break;    	
				}
			}
		}
	}

	/**
	 * @return the mapaControlDespliegue
	 */
	public Map<String, Boolean> getMapaControlDespliegue() {
		return mapaControlDespliegue;
	}

	/**
	 * @param mapaControlDespliegue the mapaControlDespliegue to set
	 */
	public void setMapaControlDespliegue(Map<String, Boolean> mapaControlDespliegue) {
		this.mapaControlDespliegue = mapaControlDespliegue;
	}

	/**
	 * @return the indexTabPrincipal
	 */
	public int getIndexTabPrincipal() {
		return indexTabPrincipal;
	}

	/**
	 * @param indexTabPrincipal the indexTabPrincipal to set
	 */
	public void setIndexTabPrincipal(int indexTabPrincipal) {
		this.indexTabPrincipal = indexTabPrincipal;
	}

	/**
	 * Metodo para cambiar la visualizacion de los paneles
	 * @param event El evento que ejecuto el metodo
	 * @author Felipe Criales
	 */
	public void cambiarVisualizacionPaneles(ActionEvent event){
		try {
			UIComponent component = event.getComponent();
			String nombreBoton = (String) component.getId();			
			if(nombreBoton != null){
				// Cambiar al panel de nuevo paciente
				if(nombreBoton.equals("nuevoPaciente")){
					this.visualizarPanelPersonalizado("nuevoPaciente");
				}
				// Cambiar al panel de consultar paciente
				else if(nombreBoton.equals("buscarPaciente")){
					this.visualizarPanelPersonalizado("buscarPaciente");										
				}	
			}
		}
		catch (Exception e) {
			log.error("Erorr al cambial la visualizacion de los paneles",e);
		}
	}
	
	/**
	 * Visualiza la opcion de panel que se desee
	 * @param nombreOpcion El nombre de la opcion
	 */
	public void visualizarPanelPersonalizado(String nombreOpcion){
		if(nombreOpcion.equals("nuevoPaciente")){
			this.indexTabPrincipal = this.INDEX_TAB_PACIENTE;
			this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_PACIENTE, new Boolean(true));
			this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_PACIENTE, null);
		}
		else if(nombreOpcion.equals("buscarPaciente")){
			this.indexTabPrincipal = this.INDEX_TAB_PACIENTE;
			this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_PACIENTE, null);
			this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_PACIENTE, new Boolean(true));	
		}
		else if(nombreOpcion.equals("buscarAgente")){
			this.indexTabPrincipal = this.INDEX_TAB_AGENTE;
			this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_AGENTE, null);
			this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_AGENTE, new Boolean(true));
		}
		else if(nombreOpcion.equals("nuevoAgente")){
			this.indexTabPrincipal = this.INDEX_TAB_AGENTE;
			this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_AGENTE, null);
			this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_AGENTE, new Boolean(true));
		}
		else if(nombreOpcion.equals("buscarEntidad")){
			this.indexTabPrincipal = this.INDEX_TAB_ENTIDADES;
			this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVA_ORGANIZACION, null);
			this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_ORGANIZACION, new Boolean(true));
		}
	}
	
	
	/**
	 * Metodo para cambiar la visulizacion de la interfaz del usuario
	 * @param event El evento que invoco el metodo
	 * @author Felipe Criales
	 */
	public void eventoBotonCambiarVisualizacion(ActionEvent event){
		try {
			UIComponent component = event.getComponent();
			String nombreBoton = (String) component.getId();	
			FacesContext context = FacesContext.getCurrentInstance();
			if(nombreBoton != null){
				// 1. Si el tab seleccionado es evento
				if(this.indexTabPrincipal == this.INDEX_TAB_EVENTO){
					// 1.1 Operacion para nuevo evento
					if(nombreBoton.equals("botonNuevo")){
						this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_EVENTO, new Boolean(true));
						this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_EVENTO, null);						
						if(context != null){
							ManejadorEventos manejadorEventos = (ManejadorEventos) context.getApplication().evaluateExpressionGet(context, "#{manejadorEventos}", ManejadorEventos.class);
					    	if(manejadorEventos != null)
					    		manejadorEventos.nuevoEvento();							
						}							
					}
					// 1.2 Operacion para consultar un evento
					else if(nombreBoton.equals("botonGuardar")){						
						if(context != null){
							ManejadorEventos manejadorEventos = (ManejadorEventos) context.getApplication().evaluateExpressionGet(context, "#{manejadorEventos}", ManejadorEventos.class);
					    	if(manejadorEventos != null)
					    		manejadorEventos.guardarEvento();							
						}
					}
					// 1.2 Operacion para consultar un evento
					else if(nombreBoton.equals("botonConsultar")){
						this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_EVENTO, new Boolean(true));
						this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_EVENTO, null);				
					}
				}
				
				// 2. Si el tab seleccionado es Pacientes
				else if(this.indexTabPrincipal == this.INDEX_TAB_PACIENTE){
					// 2.1 Operacion para nuevo paciente
					if(nombreBoton.equals("botonNuevo")){
						this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_PACIENTE, new Boolean(true));
						this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_PACIENTE, null);						
						if(context != null){
							Paciente paciente = (Paciente) context.getApplication().evaluateExpressionGet(context, "#{paciente}", Paciente.class);
					    	if(paciente != null)
					    		paciente.inicializarNuevoPaciente();				
						}
					}
					// 2.2 Operacion para guardar un paciente
					else if(nombreBoton.equals("botonGuardar")){
						System.out.println("Guardar paciente");
					}
					// 2.2 Operacion para consultar un paciente
					else if(nombreBoton.equals("botonConsultar")){		
						this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_PACIENTE, null);
						this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_PACIENTE, new Boolean(true));
					}						
				}				
				
				// 3. Si el tab seleccionado es Agentes
				else if(this.indexTabPrincipal == this.INDEX_TAB_AGENTE){
					// 3.1 Operacion para nuevo agente
					if(nombreBoton.equals("botonNuevo")){
							this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_AGENTE, null);
							this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_AGENTE, new Boolean(true));
					}
					// 3.2 Operacion para guardar un agente
					else if(nombreBoton.equals("botonGuardar")){
						Agente agente = (Agente) context.getApplication().evaluateExpressionGet(context, "#{agente}", Agente.class);
				    	if(agente != null)
				    		agente.guardarAgente();
					}
					// 3.2 Operacion para consultar un agente
					else if(nombreBoton.equals("botonConsultar")){	
						this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVO_AGENTE, null);
						this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_AGENTE, new Boolean(true));
					}					
				}
				
				// 4. Si el tab seleccionado es casos
				else if(this.indexTabPrincipal == this.INDEX_TAB_CASO){
					// 5.1 Para un neuevo caso
					if(nombreBoton.equals("botonNuevo")){
						// TODO que pasa con nuevo caso						
					}
					// 5.2 Operacion para guardar un caso
					else if(nombreBoton.equals("botonGuardar")){
						ManejadorCasosMedico manejadorCasos = (ManejadorCasosMedico) context.getApplication().evaluateExpressionGet(context, "#{manejadorCasosMedico}", ManejadorCasosMedico.class);
				    	if(manejadorCasos != null){
				    		manejadorCasos.guardarCerrarCaso();
				    	}
					}
					// 5.2 Operacion para consultar un caso
					else if(nombreBoton.equals("botonConsultar")){		
						// TODO hacer consutlar un caso
					}	
				}				
				
				// 5. Si el tab seleccionado es Organizaciones Ayuda
				else if(this.indexTabPrincipal == this.INDEX_TAB_ENTIDADES){
					// 5.1 Operacion para nueva orgazanicion
					if(nombreBoton.equals("botonNuevo")){
						this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVA_ORGANIZACION, new Boolean(true));
						this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_ORGANIZACION, null);
						
					}
					// 5.2 Operacion para guardar una organizacion
					else if(nombreBoton.equals("botonGuardar")){
						Entidad entidad = (Entidad) context.getApplication().evaluateExpressionGet(context, "#{entidad}", Entidad.class);
						if(entidad != null)
							entidad.guardarEntidad();
					}
					// 5.3 Operacion para consultar una organizacion
					else if(nombreBoton.equals("botonConsultar")){		
						this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_ORGANIZACION, new Boolean(true));
						this.mapaControlDespliegue.put(this.SUB_VISTA_NUEVA_ORGANIZACION, null);
					}					
				}
				
				// 6. Si el tab seleccionado es Usuarios
				else if(this.indexTabPrincipal == this.INDEX_TAB_USUARIOS){
					// 6.1 Operacion para nueva orgazanicion
					if(nombreBoton.equals("botonNuevo")){
						this.mapaControlDespliegue.put(this.SUB_VISTA_CREAR_USUARIO, new Boolean(true));
						this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_USUARIOS, null);
						
					}
					// 6.2 Operacion para guardar un Usuario
					else if(nombreBoton.equals("botonGuardar")){
						Usuario usuario = (Usuario) context.getApplication().evaluateExpressionGet(context, "#{usuario}", Usuario.class);
						if(usuario != null)
							usuario.guardarUsuario();
					}
					// 6.3 Operacion para consultar un Usuario
					else if(nombreBoton.equals("botonConsultar")){		
						this.mapaControlDespliegue.put(this.SUB_VISTA_CONSULTAR_USUARIOS, new Boolean(true));
						this.mapaControlDespliegue.put(this.SUB_VISTA_CREAR_USUARIO, null);
					}					
				}

			}
		} catch (Exception e) {
			log.error("Error en alguno de los botones de consulta, nuevo o guardar",e);
		}
	}
}
